#include "ScnsSmctp.c.h"

#if defined(SCNS_SMCTP_ENABLE)&&SCNS_SMCTP_ENABLE==1

#include "ScnsMenu.h"
#include "ScnsMath.h"
#include "ScnsTimer.h"
#include "ScnsLed.h"

const ScnsSmctpChanelConfig scnsSmctpChanelConfig[SCNS_SMCTP_CHANNEL_MAX]={
    [SCNS_SMCTP_CHANNEL_MENU]={.callback=scnsMenuReceiveInterrupt},

};

ScnsStatus scnsBspSmctpInit(void)
{
    gpio_init(C5,GPI,GPIO_HIGH,GPI_PULL_UP);
    uart_init(UART_6,460800,UART6_TX_C6,UART6_RX_C7);
    UART6->IER|=UART_ISR_RXINTF_MASK;
    scnsCheckTimeOut(100000,SCNS_STATUS_OK==scnsBspSmctpCanSend(),SCNS_STATUS_FULL);
    uart_tx_dma_init(UART_6,3);
    uart_rx_dma_init(UART_6,4);
    return SCNS_STATUS_OK;
}

ScnsStatus scnsBspSmctpCanSend(void)
{
    return gpio_get_level(C5)?SCNS_STATUS_FULL:SCNS_STATUS_OK;
    //return SCNS_STATUS_OK;
}

void scnsBspSmctpSend(const uint8*buf,uint32 *len)
{
    *len=scnsMin(*len,30);
    scnsLedToggleAfter(SCNS_LED_2,25*1000);
    SCB_CleanDCache_by_Addr((uint32_t*)buf,*len);
    uart_tx_dma_start(UART_6,buf,*len);
}

void scnsBspSmctpReceiveIdleDmaStart(uint8*buf,uint32 len)
{
    scnsLedToggleAfter(SCNS_LED_2,25*1000);
    uart_rx_dma_start(UART_6,buf,len);
}

void scnsBspSmctpReceiveIdleDmaStop(uint8*buf,uint32 len)
{
    scnsLedToggleAfter(SCNS_LED_2,25*1000);
    uart_rx_dma_stop(UART_6);
    SCB_InvalidateDCache_by_Addr((uint32_t*)buf,len);
}

int32 scnsBspSmctpReceiveIdleDmaGetLength(void)
{
    return -dma_index[((uart_rx_dma[UART_6])&0xF0)>>4]->CH[(uart_rx_dma[UART_6])&0x0f].CNDTR;
}

#endif